<?php
/**
 * WSCORE Functions
 * @author wsfuyibing <websearch@163.com>
 * @source [PATH]project/base/functions.php
 * @date 2013-12-23
 */
defined('WSCORE') || exit('Access-Denied');
/**
 * Yii框架的APP方法
 */
function A($p){
	/**
	 *
	 * @param string $p, 层级方法或属性
	 * @return A() Yii::app()
	 * @return A('user') Yii::app()->user
	 */
	$app = Yii::app();
	if ($p && preg_match("/^([a-z_][a-z0-9_]*)$/i", $p)){
		return $app->$p;
	}
	return $app;
}
/**
 * CallBack回调方法
 */
function C($m, $p = array()){
	is_array($p) || $p = array();
	/**
	 * 数组[对象]
	 * @param array|string $m, 回调方法|函数[callable]
	 *        $m = 'class::function';
	 *        $m = array('class', 'function')
	 * @param mixed array $p, 传递给$m方法的参数
	 *        $p = array('param1', ....)
	 */
	if (is_callable($m)){
		return count($p) ? call_user_func_array($m, $p) : call_user_func($m);
	}
	/**
	 * 无效的回调方法
	 */
	E('CALLBACK_INVALID');
}
/**
 * Yii框架的DAO方法
 * DAO(Data Access Objects)
 */
function D($p = ''){
	/**
	 * 执行SQL
	 * @param string $p, SQL语句
	 *        UPDATE table SET field = value WHERE primarykey = primaryid
	 */
	$d = A('db');
	if ($p){
		return $d->createCommand($p);
	}
	return $d->createCommand();
}
/**
 * Yii框架的Exception
 */
function E($p, $a = null){
	$_x = L($p);
	$_x === null && $_x = $p;
	/**
	* 解析
	*/
	if (is_array($a) && count($a)){
		$_x = preg_replace("/\{([_a-z0-9\-\.]+)\}/ie", "isset(\$a['\\1']) ? \$a['\\1'] : '--'", $_x);
	} throw new CException($_x);
}
/**
 * 链接HREF
 * @example H('my://account')
 * @example H('my://account', array('a' => 'b', 'c' => 'd'))
 */
function H($s, $p = array()){
	$r = '';
	is_array($p) || $p = array();
	/**
	 * 子域名前置
	 * @var string $r, 返回格式
	 */
	if (preg_match("/^([a-z0-9_\-\.]+):\/\/(\S*)$/", $s, $_m)){
		$s = $_m[2];
		$r = S('WSCORE_DOMAIN_SCHEME');
		$r .= $_m[1];
		$r .= S('WSCORE_DOMAIN_SUFFIX');
	}
	if ($s){
		$r .= '/' . $s;
	}
	/**
	 * Query
	 */
	if (count($p)){
		$comma = '?';
		foreach ($p as $_k => $_v){
			$_v = (string) $_v;
			if ($_v != ''){
				$r .= $comma;
				$comma = '&amp;';
				$r .= $_k . '=' . urlencode($_v);
			}
		}
	}
	return $r;
}
/**
 * I(Input)方法
 * @example I('g.id') 等价于 $_GET['id']
 *          I('p.id.x') 等价于 $_POST['id']['x']
 * @example I('g.id', 1) 等价于 $_GET['id'] = 1
 *          I('p.id.x', 1) 等价于 $_POST['id']['x'] = 1
 */
function I(){
	/**
	 * 首参数检查
	 * @param string $args[0], [必须]配置名称
	 *        eg: WDI('c.key') <=> $_COOKIE['key']
	 *        eg: WDI('f.key') <=> $_FILES['key']
	 *        eg: WDI('g.key') <=> $_GET['key']
	 *        eg: WDI('p.key') <=> $_POST['key']
	 *        eg: WDI('s.key') <=> $_SESSION['key']
	 *        eg: WDI('v.key') <=> $_SERVER['key']
	 * @param any $args[1], [可选]配置赋值
	 * @var int $_ai, 参数数量
	 * @var array $_as, 参数数组
	 */
	if (($_ai = func_num_args()) < 1){
		return null;
	}
	/**
	 * 获取参数
	 */
	$_as = func_get_args();
	if (preg_match("/^[a-z]\.([a-z0-9_\*\.]+)$/i", $_as[0])){
		/**
		 *
		 * @var array $_ass, 首参数转数组
		 * @var int $_asi, 首参数数组分项数
		 * @var array $_tmp, 临时数据
		 */
		$_ass = explode('.', $_as[0]);
		$_asi = count($_ass);
		$_tmp = null;
		if ($_asi > 1){
			$_ass[0] = strtolower($_ass[0]);
			/**
			 * 分项类型
			 */
			switch ($_ass[0]){
				case 'c' :
					$_tmp = & $_COOKIE;
					break;
				case 'f' :
					$_tmp = & $_FILES;
					break;
				case 'g' :
					$_tmp = & $_GET;
					break;
				case 'p' :
					$_tmp = & $_POST;
					break;
				case 's' :
					$_tmp = & $_SESSION;
					break;
				case 'v' :
					$_tmp = & $_SERVER;
					break;
			}
		}
		/**
		 * 不支持的类型
		 */
		if ($_tmp === null){
			return null;
		}
		/**
		 *
		 * @var any $_rc, Result Conference
		 * @var any $_rk, Result lastKey
		 */
		$_rc = null;
		$_rk = null;
		for ($i = 1; $i < $_asi; $i++){
			$_rc === null && $_rc = & $_tmp;
			$_rk = $_ass[$i];
			/**
			 * 返回全部
			 */
			if ($_rk == '*'){
				break;
			}
			/**
			 * 分项检查
			 */
			else{
				isset($_rc[$_rk]) || $_rc[$_rk] = $i < ($_asi - 1) ? array() : null;
				$_rc = & $_rc[$_rk];
			}
		}
		/**
		 * 赋值
		 */
		isset($_as[1]) && $_rc = $_as[1];
		/**
		 * 返回
		 */
		return $_rc;
	}
	/**
	 * 返回
	 */
	return null;
}
/**
 * [读写]模块语言
 */
function L(){
	/**
	 * 首参数检查
	 * @param string $args[0], [必须]配置名称
	 * @param any $args[1], [可选]配置赋值
	 * @var int $_ai, 参数数量
	 * @var array $_as, 参数数组
	 */
	if (($_ai = func_num_args()) < 1){
		return null;
	} $_as = func_get_args();
	/**
	 * 返回配置
	 */
	$result = $_ai > 1 ? wsc::module_language($_as[0], $_as[1]) : wsc::module_language($_as[0]);
	$result || $result = $_as[0];
	return $result;
}
/**
 * [加载]模块对象/M(Module)方法
 * @example M('test') 加载 WSCORE_PATH.'/module/test.php' 的 class TestModule {...}
 *          M('test/name') 加载 WSCORE_PATH.'/module/test/name.php' 的 class TestNameModule {...}
 */
function M($p){
	if (preg_match("/^[a-z_]([a-z0-9_\/]*)[a-z0-9_]$/", $p)){
		return wsc::module($p);
	} E('MODULE_INVALID', array('module' => $p));
}
/**
 * [读写]模块配置
 */
function S(){
	/**
	 * 首参数检查
	 * @param string $args[0], [必须]配置名称
	 * @param any $args[1], [可选]配置赋值
	 * @var int $_ai, 参数数量
	 * @var array $_as, 参数数组
	 */
	if (($_ai = func_num_args()) < 1){
		return null;
	}
	$_as = func_get_args();
	/**
	 * 返回配置
	 */
	return $_ai > 1 ? wsc::module_setting($_as[0], $_as[1]) : wsc::module_setting($_as[0]);
} 